package com.kgc.personprovider.util;

import com.kgc.personcommon.pojo.Permission;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 通用树形结构工具
 */
public class TreeUtil {

    /**
     * 将扁平的 Permission 列表组装成树形结构
     *
     * @param nodes    扁平列表，列表中每个 Permission 的 children 最好先为 null
     * @param rootPid  根节点的 pid 值（通常是 0 或者 null）
     * @return         根节点列表
     */
    public static List<Permission> buildTree(List<Permission> nodes, int rootPid) {
        // 1. 按 id 建立映射，方便快速查 parent
        Map<Integer, Permission> idToNode = nodes.stream()
                .collect(Collectors.toMap(Permission::getId, node -> {
                    node.setChildren(new ArrayList<>()); // 初始化 children
                    return node;
                }));

        // 2. 找出所有根节点，以及把其余节点挂到父节点的 children
        List<Permission> roots = new ArrayList<>();
        for (Permission node : nodes) {
            if (node.getPid() == rootPid) {
                roots.add(node);
            } else {
                Permission parent = idToNode.get(node.getPid());
                if (parent != null) {
                    parent.getChildren().add(node);
                }
            }
        }
        return roots;
    }
}
